package com.xyyl.patient.core.util;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

/**
 * @ClassName: DateUtils
 * @Description: Date工具类
 * @author chens
 * @date 2017年8月18日
 *
 */
public class DateUtils extends org.apache.commons.lang.time.DateUtils {

	private static String datetimeFormat = "yyyy-MM-dd HH:mm:ss";

	private static String dateFormat = "yyyy-MM-dd";

	private static ThreadLocal<DateFormat> dateTimeFormatLocal = new ThreadLocal<DateFormat>();

	private static ThreadLocal<DateFormat> dateFormatLocal = new ThreadLocal<DateFormat>();

	public static DateFormat getDateFormat() {
		DateFormat df = dateFormatLocal.get();
		if (df == null) {
			df = new SimpleDateFormat(dateFormat);
			dateFormatLocal.set(df);
		}
		return df;
	}

	public static DateFormat getDateTimeFormat() {
		DateFormat df = dateTimeFormatLocal.get();
		if (df == null) {
			df = new SimpleDateFormat(datetimeFormat);
			dateTimeFormatLocal.set(df);
		}
		return df;
	}

	/**
	 * 方法名称: currentDatetime ； 
	 * 方法描述: 返回当前时间 日期 时间格式yyyy-MM-dd HH:mm:ss 
	 * 返回类型:String ；
	 * @throws
	 */
	public static String currentDatetime() {
		return getDateTimeFormat().format(now());

	}

	/**
	 *方法名称: formatDatetime ；
	 *方法描述: 转换时间格式 ；
	 * 日期时间格式yyyy-MM-dd HH:mm:ss 
	 *返回类型:String ； 
	 * @throws
	 */
	public static String formatDatetime(Date date) {
		return getDateTimeFormat().format(date);
	}

	/**
	 *方法名称: formatDate ；
	 *方法描述: 转换时间格式 ；
	 *  日期时间格式yyyy-MM-dd  
	 *返回类型:String ； 
	 * @throws
	 */
	public static String formatDate(Date date) {
		return getDateFormat().format(date);
	}

	/**
	 * 方法名称: formatDatetime ； 
	 * 方法描述: 转换时间格式 ； 日期时间格式yyyy-MM-dd HH:mm:ss 
	 * 返回类型:String ；  
	 * @throws
	 */
	public static String formatDatetime(Date date, String pattern) {
		SimpleDateFormat customFormat = (SimpleDateFormat) getDateTimeFormat().clone();
		customFormat.applyPattern(pattern);
		return customFormat.format(date);
	}

	/**
	 * 方法名称: parseDatetime ； 
	 * 方法描述: 根据自定义pattern将字符串日期转换成java.util.Date类型 ； 
	 * 返回类型:Date ；
	 * @throws
	 */
	public static Date parseDatetime(String datetime, String pattern) throws ParseException {
		SimpleDateFormat format = (SimpleDateFormat) getDateTimeFormat().clone();
		format.applyPattern(pattern);
		return format.parse(datetime);
	}

	public static Date parseDate(String datetime) {
		SimpleDateFormat format = (SimpleDateFormat) getDateFormat().clone();
		try {
			return format.parse(datetime);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 方法名称: currentDate ； 
	 * 方法描述: 获取当前日期 ； 
	 * 返回类型: String ；
	 * @throws
	 */
	public static String currentDate() {
		return getDateFormat().format(now());
	}

	/**
	 * 方法名称: getCurrentTimeMillis ； 
	 * 方法描述: 获取时间戳 ； 
	 * 返回类型: long ； 
	 * @throws
	 */
	public static long getCurrentTimeMillis() {
		return System.currentTimeMillis();
	}

	/**
	 * 方法名称: month ； 
	 * 方法描述: 获取当前月份； 
	 * 返回类型: int ；
	 * @throws
	 */
	public static int month() {
		return calendar().get(Calendar.MONTH) + 1;
	}

	/**
	 * 方法名称: calendar ； 
	 * 方法描述: 获取当前日期 ； 
	 * 返回类型: Calendar ；
	 * 创建人：chens ；
	 * 创建时间：2013-9-17 下午10:18:15；
	 * @throws
	 */
	protected static Calendar calendar() {
		Calendar cal = GregorianCalendar.getInstance(Locale.CHINESE);
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		return cal;
	}

	protected static Date now() {
		return new Date();
	}

	/**
	 * addYear
	 * @param currentDate
	 * @param year
	 * @return
	 */
	public static String addYear(Date currentDate, int year) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(currentDate);
		cal.add(Calendar.YEAR, year);
		return formatDate(cal.getTime());
	}

	public static String addDay(Date currentDate, int day) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(currentDate);
		cal.add(Calendar.DAY_OF_YEAR, day);
		return formatDate(cal.getTime());
	}

	/**
	 * 方法名称: addHour； 
	 * 方法描述:设置过期时间； 
	 * 返回类型: String ； 
	 * 创建人：chens ； 
	 * 创建时间：2013-10-16上午12:38:31；
	 * @throws
	 */
	public static String addHour(Date currentDate, int hour) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(currentDate);
		cal.add(Calendar.HOUR, hour);
		return formatDatetime(cal.getTime());
	}

	public static String addMinute(Date currentDate,int min)  {
		Calendar cal = Calendar.getInstance();
		cal.setTime(currentDate);
		cal.add(Calendar.MINUTE, min);
		return  formatDatetime(cal.getTime());
	}
	
	/**
	 * 方法名称: getSysTimestamp 
	 * 方法描述: 获取时间戳   
	 * 返回类型: Timestamp 
	 * @throws
	 */
	public static Timestamp getSysTimestamp() {
		return new Timestamp(System.currentTimeMillis());
	}

	/**
	 * 获取某年的第一天 
	 * @param year
	 * @return
	 */
	public static Date getYearFirst(int year) {
		Calendar calendar = Calendar.getInstance();
		calendar.clear();
		calendar.set(Calendar.YEAR, year);
		Date currYearFirst = calendar.getTime();
		return currYearFirst;
	}

	/**
	 * 获取某年的最后一天
	 * @param year
	 * @return
	 */
	public static Date getYearLast(int year) {
		Calendar calendar = Calendar.getInstance();
		calendar.clear();
		calendar.set(Calendar.YEAR, year);
		calendar.roll(Calendar.DAY_OF_YEAR, -1);
		Date currYearLast = calendar.getTime();

		return currYearLast;
	}

	public static String getCurrentTime(String pattern) {
		return formatDatetime(new Date(), pattern);
	}

	public static Boolean isSameYear(String date) {
		Date orgDate = null;
		Boolean isSame = false;
		SimpleDateFormat format = (SimpleDateFormat) getDateFormat().clone();
		try {
			orgDate = format.parse(date);
			isSame = isSameYear(orgDate, new Date());
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return isSame;
	}

	public static boolean isSameYear(Date date1, Date date2) {
		return toCalendar(date1).get(Calendar.YEAR) == toCalendar(date2).get(Calendar.YEAR);
	}

	public static boolean isSameMonth(Date date1, Date date2) {
		if (isSameYear(date1, date2)) {
			return toCalendar(date1).get(Calendar.MONTH) == toCalendar(date2).get(Calendar.MONTH);
		}
		return false;
	}

	public static Long toTimeMillis(String date) {
		SimpleDateFormat customFormat = (SimpleDateFormat) getDateTimeFormat().clone();
		try {
			return customFormat.parse(date).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	/*
	 * 将时间戳转换为时间
	 */
	public static String stampToDate(long s){
		String res;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = new Date(s);
		res = simpleDateFormat.format(date);
		return res;
	}

	public static void main(String[] args) {
		System.out.println(currentDatetime());
	}
}
